package com.learn.algorithm.exercises.nowcoder;

import java.util.HashSet;

/**
 * @author wangxing
 * @version 2020/7/10 21:57 Administrator
 */
public class StringLearnProblem {
    static HashSet<Character> numSet = new HashSet<>(22);

    static {
        numSet.add('0');
        numSet.add('1');
        numSet.add('2');
        numSet.add('3');
        numSet.add('4');
        numSet.add('5');
        numSet.add('6');
        numSet.add('7');
        numSet.add('8');
        numSet.add('9');
        numSet.add('A');
        numSet.add('B');
        numSet.add('C');
        numSet.add('D');
        numSet.add('E');
        numSet.add('F');
    }

    /**
     * 给定一个包含大写英文字母和数字的句子，找出这个句子所包含的最大的十六进制整数，返回这个整数的值。数据保证该整数在int表示范围内
     * 涉及的操作是一个是位置判定,一个是16进制转10进制
     * 16进制  hexadecimal 转 10进制 decimalism
     *
     * @param s string字符串
     * @return int整型
     */
    public int getMaxDecimalism(String s) {
        char[] charArr = s.toCharArray();
        int max = 0;
        StringBuilder temp = new StringBuilder();
        for (char c : charArr) {
            if (numSet.contains(c)) {
                temp.append(c);
            } else {
                if (temp.length() >= 1) {
                    max = Math.max(max, Integer.parseInt(temp.toString(), 16));
                }
                temp = new StringBuilder();
            }
        }
        if (max == 0 && temp.length() >= 1) {
            max = Math.max(max, Integer.parseInt(temp.toString(), 16));
        }
        return max;
    }

    static HashSet<Character> evenNum = new HashSet<>();

    static {
        evenNum.add('2');
        evenNum.add('4');
        evenNum.add('6');
        evenNum.add('8');
    }

    /**
     * 将字符串数字中为偶数位的数字进行翻转，将翻转后的结果进行输出。
     *
     * @param number string字符串
     * @return string字符串
     */
    public String change(String number) {
        // write code here
        char[] charArr = number.toCharArray();
        int length = charArr.length;
        int headIndex = 0;
        int endIndex = length - 1;
        boolean left = false, right = false;
        while (headIndex < endIndex) {
            if (evenNum.contains(charArr[headIndex])) {
                left = true;
            } else {
                headIndex++;
            }
            if (evenNum.contains(charArr[endIndex])) {
                right = true;
            } else {
                endIndex--;
            }
            if (left && right) {
                left = false;
                right = false;
                char temp = charArr[headIndex];
                charArr[headIndex] = charArr[endIndex];
                charArr[endIndex] = temp;
                headIndex++;
                endIndex--;
            }
        }
        StringBuilder str = new StringBuilder();
        for (char c : charArr) {
            str.append(c);
        }
        return str.toString();
    }
}
